package com.xx.controller;

import com.xx.common.core.domain.R;
import com.xx.service.ShipDataService;
import com.xx.system.domain.data.ShipData;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * 船舶数据控制器，用于处理与船舶实时数据相关的请求
 *
 * @Author kzw
 * @Date 2025/3/27 14:41
 */
@RestController
@RequestMapping("/ship")
@RequiredArgsConstructor
public class ShipDataController {

    // 注入船舶数据服务
    private final ShipDataService shipDataService;

    // 注入Redis模板，用于操作Redis缓存
    @Resource(name = "redisTemplate")
    private RedisTemplate<String, Object> redisTemplate;

    // 定义实时船舶数据在Redis中的键前缀
    private static final String REALTIME_SHIP_DATA_KEY = "realtime:ship:data";

    /**
     * 获取实时船舶数据
     *
     * @return 实时船舶数据列表
     */
    @GetMapping("/realtime")
    public R<List<ShipData>> getRealtimeShipData() {
        List<ShipData> data = shipDataService.getRealtimeShipData();
        return R.ok(data);
    }

    /**
     * 从缓存中获取实时船舶数据
     *
     * @return 缓存中的实时船舶数据列表
     */
    @GetMapping("/realtime/cache")
    public R<List<ShipData>> getRealtimeShipDataFromCache() {
        List<ShipData> result = new ArrayList<>();
        Set<Object> mmsiSet = redisTemplate.opsForSet().members(REALTIME_SHIP_DATA_KEY);
        if (mmsiSet != null) {
            for (Object mmsi : mmsiSet) {
                String shipKey = REALTIME_SHIP_DATA_KEY + ":" + mmsi;
                ShipData shipData = (ShipData) redisTemplate.opsForValue().get(shipKey);
                if (shipData != null) {
                    result.add(shipData);
                }
            }
        }
        return R.ok(result);
    }

    /**
     * 根据MMSI从缓存中获取实时船舶数据
     *
     * @param mmsi 船舶的MMSI编号
     * @return 指定MMSI的实时船舶数据，如果未找到则返回失败消息
     */
    @GetMapping("/realtime/cache/{mmsi}")
    public R<ShipData> getRealtimeShipDataByMmsi(@PathVariable Long mmsi) {
        String shipKey = REALTIME_SHIP_DATA_KEY + ":" + mmsi;
        ShipData shipData = (ShipData) redisTemplate.opsForValue().get(shipKey);
        return shipData != null ? R.ok(shipData) : R.fail("未找到指定MMSI的船舶数据");
    }

    /**
     * 根据船舶名称或MMSI号查询最新的船舶数据
     *
     * @param shipName 船舶名称（可选）
     * @param mmsi MMSI号（可选）
     * @return 最新的船舶数据
     */
    @GetMapping("/search")
    public R<ShipData> searchLatestShipData(String shipName, String mmsi) {
        if ((shipName == null || shipName.trim().isEmpty()) && mmsi == null) {
            return R.fail("船舶名称和MMSI号至少需要提供一个");
        }

        ShipData shipData = shipDataService.getLatestShipDataByNameOrMmsi(shipName, mmsi);
        return shipData != null ? R.ok(shipData) : R.fail("未找到匹配的船舶数据");
    }

}
